Replace the xpm collate icons by cairo drawing that respects themes.
authorMatthias Clasen <matthiasc@src.gnome.org>
Wed, 3 May 2006 20:18:38 +0000 (20:18 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Wed, 3 May 2006 20:18:38 +0000 (20:18 +0000)
* gtk/gtkprintunixdialog.c: Replace the xpm collate icons
by cairo drawing that respects themes.

ChangeLog
ChangeLog.pre-2-10
gtk/gtkprintunixdialog.c

index 5cca937c89eb2d1360a83e60e164db2a78e7c441..034e7e2ff43767d735dfbd3a81efe8ed6c5a6ff0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2006-05-03  Matthias Clasen  <mclasen@redhat.com>
 
+       * gtk/gtkprintunixdialog.c: Replace the xpm collate icons
+       by cairo drawing that respects themes.
+
        * gdk/quartz/Makefile.am (libgdk_quartz_la_SOURCES): Add
        missing files.  (#340533, Ludovic Rousseau)
 
index 5cca937c89eb2d1360a83e60e164db2a78e7c441..034e7e2ff43767d735dfbd3a81efe8ed6c5a6ff0 100644 (file)
@@ -1,5 +1,8 @@
 2006-05-03  Matthias Clasen  <mclasen@redhat.com>
 
+       * gtk/gtkprintunixdialog.c: Replace the xpm collate icons
+       by cairo drawing that respects themes.
+
        * gdk/quartz/Makefile.am (libgdk_quartz_la_SOURCES): Add
        missing files.  (#340533, Ludovic Rousseau)
 
index 9ac102f996e7915dad7fabda55f9d86e90a7db09..f2cdd8040a490857aff29b8d05fa24a5548ccd88 100644 (file)
@@ -31,6 +31,7 @@
 #include "gtkcellrendererpixbuf.h"
 #include "gtkcellrenderertext.h"
 #include "gtkstock.h"
+#include "gtkiconfactory.h"
 #include "gtkimage.h"
 #include "gtktreeselection.h"
 #include "gtknotebook.h"
@@ -65,6 +66,8 @@ static void gtk_print_unix_dialog_get_property (GObject            *object,
                                                guint               prop_id,
                                                GValue             *value,
                                                GParamSpec         *pspec);
+static void gtk_print_unix_dialog_style_set    (GtkWidget          *widget,
+                                               GtkStyle           *previous_style);
 static void populate_dialog                    (GtkPrintUnixDialog *dialog);
 static void unschedule_idle_mark_conflicts     (GtkPrintUnixDialog *dialog);
 static void selected_printer_changed           (GtkTreeSelection   *selection,
@@ -171,187 +174,6 @@ struct GtkPrintUnixDialogPrivate
 
 G_DEFINE_TYPE (GtkPrintUnixDialog, gtk_print_unix_dialog, GTK_TYPE_DIALOG);
 
-/* XPM */
-static const char *collate_xpm[] = {
-"65 35 6 1",
-"      c None",
-".     c #000000",
-"+     c #020202",
-"@     c #FFFFFF",
-"#     c #010101",
-"$     c #070707",
-"           ..++++++++++++++++..              ..++++++++++++++++..",
-"           ..++++++++++++++++..              ..++++++++++++++++..",
-"           ..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..",
-"           ..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..",
-"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
-"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
-"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
-"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
-"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
-"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
-"..+++++++++##++++++$@@@@@@@@@..   ..+++++++++##++++++$@@@@@@@@@..",
-"..+++++++++##+++++#+@@@@@@@@@..   ..+++++++++##+++++#+@@@@@@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@@@@@@..   ..@@@@@@@@@@@@@@@@++@@@@@@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@..@@@@..   ..@@@@@@@@@@@@@@@@++@@@..@@@@..",
-"..@@@@@@@@@@@@@@@@++@@.@@.@@@..   ..@@@@@@@@@@@@@@@@++@@.@@.@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@@.@@@..   ..@@@@@@@@@@@@@@@@++@@@@@.@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@.@@@@..   ..@@@@@@@@@@@@@@@@++@@@@.@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@.@@@@@..   ..@@@@@@@@@@@@@@@@++@@@.@@@@@..",
-"..@@@@@@@@@@@@@@@@++@@.@@@@@@..   ..@@@@@@@@@@@@@@@@++@@.@@@@@@..",
-"..@@@@@@@@@@@@@@@@++@@....@@@..   ..@@@@@@@@@@@@@@@@++@@....@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@@@@@@..   ..@@@@@@@@@@@@@@@@++@@@@@@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@@@@@@..   ..@@@@@@@@@@@@@@@@++@@@@@@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@@@@@@..   ..@@@@@@@@@@@@@@@@++@@@@@@@@@..",
-"..@@@@@@@@@@@.@@@@.............   ..@@@@@@@@@@@.@@@@.............",
-"..@@@@@@@@@@..@@@@.............   ..@@@@@@@@@@..@@@@.............",
-"..@@@@@@@@@@@.@@@@..              ..@@@@@@@@@@@.@@@@..           ",
-"..@@@@@@@@@@@.@@@@..              ..@@@@@@@@@@@.@@@@..           ",
-"..@@@@@@@@@@@.@@@@..              ..@@@@@@@@@@@.@@@@..           ",
-"..@@@@@@@@@@@.@@@@..              ..@@@@@@@@@@@.@@@@..           ",
-"..@@@@@@@@@@...@@@..              ..@@@@@@@@@@...@@@..           ",
-"..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..           ",
-"..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..           ",
-"..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..           ",
-"....................              ....................           ",
-"....................              ....................           "};
-
-/* XPM */
-static const char *nocollate_xpm[] = {
-"65 35 6 1",
-"      c None",
-".     c #000000",
-"+     c #FFFFFF",
-"@     c #020202",
-"#     c #010101",
-"$     c #070707",
-"           ....................              ....................",
-"           ....................              ....................",
-"           ..++++++++++++++++..              ..++++++++++++++++..",
-"           ..++++++++++++++++..              ..++++++++++++++++..",
-"           @@++++++++++++++++..              @@++++++++++++++++..",
-"           @@++++++++++++++++..              @@++++++++++++++++..",
-"           @@++++++++++++++++..              @@++++++++++++++++..",
-"           @@++++++++++++++++..              @@++++++++++++++++..",
-"           @@++++++++++++++++..              @@++++++++++++++++..",
-"           @@++++++++++++++++..              @@++++++++++++++++..",
-"..@@@@@@@@@##@@@@@@$+++++++++..   ..@@@@@@@@@##@@@@@@$+++++++++..",
-"..@@@@@@@@@##@@@@@#@+++++++++..   ..@@@@@@@@@##@@@@@#@+++++++++..",
-"..++++++++++++++++@@+++++++++..   ..++++++++++++++++@@+++++++++..",
-"..++++++++++++++++@@++++.++++..   ..++++++++++++++++@@+++..++++..",
-"..++++++++++++++++@@+++..++++..   ..++++++++++++++++@@++.++.+++..",
-"..++++++++++++++++@@++++.++++..   ..++++++++++++++++@@+++++.+++..",
-"..++++++++++++++++@@++++.++++..   ..++++++++++++++++@@++++.++++..",
-"..++++++++++++++++@@++++.++++..   ..++++++++++++++++@@+++.+++++..",
-"..++++++++++++++++@@++++.++++..   ..++++++++++++++++@@++.++++++..",
-"..++++++++++++++++@@+++...+++..   ..++++++++++++++++@@++....+++..",
-"..++++++++++++++++@@+++++++++..   ..++++++++++++++++@@+++++++++..",
-"..++++++++++++++++@@+++++++++..   ..++++++++++++++++@@+++++++++..",
-"..++++++++++++++++@@+++++++++..   ..++++++++++++++++@@+++++++++..",
-"..+++++++++++.++++.............   ..++++++++++..++++.............",
-"..++++++++++..++++.............   ..+++++++++.++.+++.............",
-"..+++++++++++.++++..              ..++++++++++++.+++..           ",
-"..+++++++++++.++++..              ..+++++++++++.++++..           ",
-"..+++++++++++.++++..              ..++++++++++.+++++..           ",
-"..+++++++++++.++++..              ..+++++++++.++++++..           ",
-"..++++++++++...+++..              ..+++++++++....+++..           ",
-"..++++++++++++++++..              ..++++++++++++++++..           ",
-"..++++++++++++++++..              ..++++++++++++++++..           ",
-"..++++++++++++++++..              ..++++++++++++++++..           ",
-"....................              ....................           ",
-"....................              ....................           "};
-
-/* XPM */
-static const char *collate_reverse_xpm[] = {
-"65 35 6 1",
-"      c None",
-".     c #000000",
-"+     c #020202",
-"@     c #FFFFFF",
-"#     c #010101",
-"$     c #070707",
-"           ..++++++++++++++++..              ..++++++++++++++++..",
-"           ..++++++++++++++++..              ..++++++++++++++++..",
-"           ..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..",
-"           ..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..",
-"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
-"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
-"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
-"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
-"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
-"           ++@@@@@@@@@@@@@@@@..              ++@@@@@@@@@@@@@@@@..",
-"..+++++++++##++++++$@@@@@@@@@..   ..+++++++++##++++++$@@@@@@@@@..",
-"..+++++++++##+++++#+@@@@@@@@@..   ..+++++++++##+++++#+@@@@@@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@@@@@@..   ..@@@@@@@@@@@@@@@@++@@@@@@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@.@@@@..   ..@@@@@@@@@@@@@@@@++@@@@.@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@..@@@@..   ..@@@@@@@@@@@@@@@@++@@@..@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@.@@@@..   ..@@@@@@@@@@@@@@@@++@@@@.@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@.@@@@..   ..@@@@@@@@@@@@@@@@++@@@@.@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@.@@@@..   ..@@@@@@@@@@@@@@@@++@@@@.@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@.@@@@..   ..@@@@@@@@@@@@@@@@++@@@@.@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@...@@@..   ..@@@@@@@@@@@@@@@@++@@@...@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@@@@@@..   ..@@@@@@@@@@@@@@@@++@@@@@@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@@@@@@..   ..@@@@@@@@@@@@@@@@++@@@@@@@@@..",
-"..@@@@@@@@@@@@@@@@++@@@@@@@@@..   ..@@@@@@@@@@@@@@@@++@@@@@@@@@..",
-"..@@@@@@@@@@..@@@@.............   ..@@@@@@@@@@..@@@@.............",
-"..@@@@@@@@@.@@.@@@.............   ..@@@@@@@@@.@@.@@@.............",
-"..@@@@@@@@@@@@.@@@..              ..@@@@@@@@@@@@.@@@..           ",
-"..@@@@@@@@@@@.@@@@..              ..@@@@@@@@@@@.@@@@..           ",
-"..@@@@@@@@@@.@@@@@..              ..@@@@@@@@@@.@@@@@..           ",
-"..@@@@@@@@@.@@@@@@..              ..@@@@@@@@@.@@@@@@..           ",
-"..@@@@@@@@@....@@@..              ..@@@@@@@@@....@@@..           ",
-"..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..           ",
-"..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..           ",
-"..@@@@@@@@@@@@@@@@..              ..@@@@@@@@@@@@@@@@..           ",
-"....................              ....................           ",
-"....................              ....................           "};
-
-/* XPM */
-static const char *nocollate_reverse_xpm[] = {
-"65 35 6 1",
-"      c None",
-".     c #000000",
-"+     c #FFFFFF",
-"@     c #020202",
-"#     c #010101",
-"$     c #070707",
-"           ....................              ....................",
-"           ....................              ....................",
-"           ..++++++++++++++++..              ..++++++++++++++++..",
-"           ..++++++++++++++++..              ..++++++++++++++++..",
-"           @@++++++++++++++++..              @@++++++++++++++++..",
-"           @@++++++++++++++++..              @@++++++++++++++++..",
-"           @@++++++++++++++++..              @@++++++++++++++++..",
-"           @@++++++++++++++++..              @@++++++++++++++++..",
-"           @@++++++++++++++++..              @@++++++++++++++++..",
-"           @@++++++++++++++++..              @@++++++++++++++++..",
-"..@@@@@@@@@##@@@@@@$+++++++++..   ..@@@@@@@@@##@@@@@@$+++++++++..",
-"..@@@@@@@@@##@@@@@#@+++++++++..   ..@@@@@@@@@##@@@@@#@+++++++++..",
-"..++++++++++++++++@@+++++++++..   ..++++++++++++++++@@+++++++++..",
-"..++++++++++++++++@@+++..++++..   ..++++++++++++++++@@++++.++++..",
-"..++++++++++++++++@@++.++.+++..   ..++++++++++++++++@@+++..++++..",
-"..++++++++++++++++@@+++++.+++..   ..++++++++++++++++@@++++.++++..",
-"..++++++++++++++++@@++++.++++..   ..++++++++++++++++@@++++.++++..",
-"..++++++++++++++++@@+++.+++++..   ..++++++++++++++++@@++++.++++..",
-"..++++++++++++++++@@++.++++++..   ..++++++++++++++++@@++++.++++..",
-"..++++++++++++++++@@++....+++..   ..++++++++++++++++@@+++...+++..",
-"..++++++++++++++++@@+++++++++..   ..++++++++++++++++@@+++++++++..",
-"..++++++++++++++++@@+++++++++..   ..++++++++++++++++@@+++++++++..",
-"..++++++++++++++++@@+++++++++..   ..++++++++++++++++@@+++++++++..",
-"..++++++++++..++++.............   ..+++++++++++.++++.............",
-"..+++++++++.++.+++.............   ..++++++++++..++++.............",
-"..++++++++++++.+++..              ..+++++++++++.++++..           ",
-"..+++++++++++.++++..              ..+++++++++++.++++..           ",
-"..++++++++++.+++++..              ..+++++++++++.++++..           ",
-"..+++++++++.++++++..              ..+++++++++++.++++..           ",
-"..+++++++++....+++..              ..++++++++++...+++..           ",
-"..++++++++++++++++..              ..++++++++++++++++..           ",
-"..++++++++++++++++..              ..++++++++++++++++..           ",
-"..++++++++++++++++..              ..++++++++++++++++..           ",
-"....................              ....................           ",
-"....................              ....................           "};
-
-
 static gboolean
 is_default_printer (GtkPrintUnixDialog *dialog,
                    GtkPrinter *printer)
@@ -378,6 +200,8 @@ gtk_print_unix_dialog_class_init (GtkPrintUnixDialogClass *class)
   object_class->set_property = gtk_print_unix_dialog_set_property;
   object_class->get_property = gtk_print_unix_dialog_get_property;
 
+  widget_class->style_set = gtk_print_unix_dialog_style_set;
+
   g_object_class_install_property (object_class,
                                   PROP_PAGE_SETUP,
                                   g_param_spec_object ("page-setup",
@@ -1377,37 +1201,110 @@ selected_printer_changed (GtkTreeSelection   *selection,
 
   update_dialog_from_settings (dialog);
 }
-
 static void
 update_collate_icon (GtkToggleButton    *toggle_button,
                     GtkPrintUnixDialog *dialog)
 {
   GtkPrintUnixDialogPrivate *priv = dialog->priv;
-  GdkPixbuf *pixbuf;
+
+  gtk_widget_queue_draw (priv->collate_image);
+}
+
+static void
+paint_page (GtkWidget *widget,
+           cairo_t   *cr, 
+           gfloat     scale,
+           gint       x_offset, 
+           gint       y_offset,
+           gchar     *text)
+{
+  gint x, y, width, height;
+  gint linewidth = 2;
+
+  x = x_offset * scale;
+  y = y_offset * scale;
+  width = 20 * scale;
+  height = 26 * scale;
+
+  gdk_cairo_set_source_color (cr, &widget->style->base[GTK_STATE_NORMAL]);
+  cairo_rectangle (cr, x, y, width, height);
+  cairo_fill (cr);
+
+  gdk_cairo_set_source_color (cr, &widget->style->text[GTK_STATE_NORMAL]);
+  cairo_set_line_width (cr, linewidth);
+  cairo_rectangle (cr, x + linewidth/2.0, y + linewidth/2.0, width - linewidth, height - linewidth);
+  cairo_stroke (cr);
+
+  cairo_select_font_face (cr, "Sans", 
+                         CAIRO_FONT_SLANT_NORMAL,
+                         CAIRO_FONT_WEIGHT_NORMAL);
+  cairo_set_font_size (cr, (gint)(9 * scale));
+  cairo_move_to (cr, x + (gint)(11 * scale), y + (gint)(21 * scale));
+  cairo_show_text (cr, text);
+}
+
+
+static gboolean
+draw_collate_cb (GtkWidget         *widget,
+                GdkEventExpose     *event,
+                GtkPrintUnixDialog *dialog)
+{
+  GtkPrintUnixDialogPrivate *priv = dialog->priv;
+  GtkSettings *settings;
+  cairo_t *cr;
+  gint size;
+  gfloat scale;
   gboolean collate, reverse;
-  const char **xpm;
 
   collate = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->collate_check));
   reverse = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->reverse_check));
 
-  if (collate)
-    {
-      if (reverse)
-       xpm = collate_reverse_xpm;
-      else
-       xpm = collate_xpm;
-    }
-  else
+  settings = gtk_widget_get_settings (widget);
+  gtk_icon_size_lookup_for_settings (settings,
+                                    GTK_ICON_SIZE_DIALOG,
+                                    &size,
+                                    NULL);
+  scale = size / 48.0;
+
+  cr = gdk_cairo_create (widget->window);
+
+  paint_page (widget, cr, scale, 15, 5, collate == reverse ? "1" : "2");
+  paint_page (widget, cr, scale, 5, 15, reverse ? "2" : "1");
+
+  paint_page (widget, cr, scale, 50, 5, reverse ? "1" : "2");
+  paint_page (widget, cr, scale, 40, 15, collate == reverse ? "2" : "1");
+  
+  cairo_destroy (cr);
+
+  return TRUE;
+}
+
+static void
+gtk_print_unix_dialog_style_set (GtkWidget *widget,
+                                GtkStyle  *previous_style)
+{
+  if (GTK_WIDGET_CLASS (gtk_print_unix_dialog_parent_class)->style_set)
+    GTK_WIDGET_CLASS (gtk_print_unix_dialog_parent_class)->style_set (widget, previous_style);
+
+  if (gtk_widget_has_screen (widget))
     {
-      if (reverse)
-       xpm = nocollate_reverse_xpm;
-      else
-       xpm = nocollate_xpm;
+      GtkPrintUnixDialog *dialog = (GtkPrintUnixDialog *)widget;
+      GtkPrintUnixDialogPrivate *priv = dialog->priv;
+      GtkSettings *settings;
+      gint size;
+      gfloat scale;
+      
+      settings = gtk_widget_get_settings (widget);
+      gtk_icon_size_lookup_for_settings (settings,
+                                        GTK_ICON_SIZE_DIALOG,
+                                        &size,
+                                        NULL);
+      scale = size / 48.0;
+      
+      gtk_widget_set_size_request (priv->collate_image, 
+                                  (50 + 20) * scale,
+                                  (15 + 26) * scale);
     }
-  
-  pixbuf = gdk_pixbuf_new_from_xpm_data (xpm);
-  gtk_image_set_from_pixbuf (GTK_IMAGE (priv->collate_image), pixbuf);
-  g_object_unref (pixbuf);
 }
 
 static void
@@ -1569,15 +1466,15 @@ create_main_page (GtkPrintUnixDialog *dialog)
                    0, 1, 2, 3,  GTK_FILL, 0,
                    0, 0);
 
-  image = gtk_image_new ();
+  image = gtk_drawing_area_new ();
   priv->collate_image = image;
   gtk_widget_show (image);
+  gtk_widget_set_size_request (image, 70, 90);
   gtk_table_attach (GTK_TABLE (table), image,
                    1, 2, 1, 3, GTK_FILL, 0,
                    0, 0);
+  g_signal_connect (image, "expose_event", G_CALLBACK (draw_collate_cb), dialog);
 
-  update_collate_icon (NULL, dialog);
-  
   label = gtk_label_new (_("General"));
   gtk_widget_show (label);